# -*- coding: utf-8 -*-

'''
Created on 27/02/2010

@author: vincent.vanghelle
'''
from django.shortcuts import render_to_response, get_object_or_404,redirect
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from mmorganizer.events.models import Evenement
from mmorganizer.events.forms import EvenementCreationForm
from mmorganizer.characters.models import Roster, Personnage
import datetime

@login_required
def list_events(request):
    #### evenements des roster de tout les personnages de l'utilisateur
    #### /!\ s'il inscrit a un évenement le perso membre d'un autre roster...
    #rosters = Roster.objects.filter(membres__id__in = request.user.personnage_set.all())
    #availableEvents = Evenement.objects.filter(roster__id__in= rosters)  
    #### evenements pour les roster du personnage par défaut ==> mettre un message pour changer de joueur si jamais il y a d'autres rosters..
    ## pour l'instant, uniquement les events a venir (les anciens sont passés donc on ne les affiche pas. 
    ## TODO Calendar comme wowrm
    availableEvents = Evenement.objects.filter(roster__id__in= request.user.get_profile().defaultPersonnage.rosters.all()).filter(dateEvent__gte=datetime.date.today()).filter(timeEvent__lte=datetime.datetime.now()).order_by('dateEvent','timeEvent')
    return render_to_response('events/list.html',{'availableEvents':availableEvents,'user':request.user})

@login_required
def create_event(request):
    if request.POST:
        form = EvenementCreationForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect('/events/detail/'+str(event.id))
        return redirect('/events/list')
    else:
        form = EvenementCreationForm()
        game_id = request.user.get_profile().game.id
        user_id = request.user.id
        form.initialiser(game_id,user_id)
    return render_to_response('events/create.html',{'form':form,'user':request.user})

# TODO :
# il ne faut afficher un membre dans les disponibles que si :
# - il est dans la liste available
# - il n'est pas dans la liste substitutes
# il ne faut afficher un membre dans les substitutes que si :
# - il est dans la liste available
# - il est dans la liste substitutes
# il ne faut afficher un membre dans les substitutes que si :
# - il est dans la liste substitutes

@login_required
def detail_event(request, event_id):
    event = Evenement.objects.get(pk=event_id)
    roster = Roster.objects.get(pk=event.roster.id)
    classes = roster.game.class_set.all()
    dic = dict()
    for classe in classes:
        available = event.available.filter(classe__id=classe.id)
        substitutes = event.substitutes.filter(classe__id=classe.id) 
        unavailable = event.unavailable.filter(classe__id=classe.id)
        dunno = roster.membres.filter(classe__id=classe.id)
        values = {'available':available,'substitutes':substitutes,'unavailable':unavailable,'dunno':dunno,'css':classe.css_name}
        dic[classe.name] = values
    return render_to_response('events/detail.html',{'participants':dic, 'user':request.user, 'event':event})

@login_required
def available(request, event_id):
    event = Evenement.objects.get(pk=event_id)
    perso = request.user.get_profile().defaultPersonnage
    # remplacant auto si quota déja atteints ==> règle à valider!!!
    if event.available.count() >= event.nombreJoueurs:
        event.substitutes.add(perso)
    event.available.add(perso)
    event.unavailable.remove(perso)
    
    event.save()
    return HttpResponseRedirect('/events/detail/'+ event_id)

@login_required
def unavailable(request, event_id):
    event = Evenement.objects.get(pk=event_id)
    perso = request.user.get_profile().defaultPersonnage
    event.unavailable.add(perso)
    event.available.remove(perso)
    event.save()
    return HttpResponseRedirect('/events/detail/'+ event_id)

# les admin du roster choisissent les remplacants, donc selection via l'id du personnage
# TODO verifier si utilisateur connecté a les droits d'admin sur le roster/event.

@login_required
def substitute(request, event_id,personnage_id):
    event = Evenement.objects.get(pk=event_id)
    perso = event.roster.membres.get(id=personnage_id)
    event.available.add(perso)
    event.substitutes.add(perso)
    event.unavailable.remove(perso)
    event.save()
    return HttpResponseRedirect('/events/detail/'+ event_id)

@login_required
def unsubstitute(request, event_id,personnage_id):
    event = Evenement.objects.get(pk=event_id)
    perso = event.roster.membres.get(id=personnage_id)
    event.available.add(perso)
    event.substitutes.remove(perso)
    event.unavailable.remove(perso)
    event.save()
    return HttpResponseRedirect('/events/detail/'+ event_id)